// internal/apps/auth/serializers/auth_serializer.go
package serializers

import "star-go-app/internal/apps/auth/models"

// LoginRequest 登录请求结构
type LoginRequest struct {
	Username string `json:"username" form:"username" binding:"required" example:"admin"`       // 用户名
	Password string `json:"password" form:"password" binding:"required" example:"password123"` // 密码
}

// RefreshTokenRequest 刷新token请求结构
type RefreshTokenRequest struct {
	RefreshToken string `json:"refresh_token" form:"refresh_token" binding:"required" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."` // 刷新令牌
}

// VerifyTokenRequest 验证token请求结构
type VerifyTokenRequest struct {
	Token string `json:"token" form:"token" binding:"required" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."` // 令牌(可以是访问令牌或刷新令牌)
}

// LogoutRequest 登出请求结构
type LogoutRequest struct {
	Token string `json:"token" form:"token" binding:"required" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."` // 访问令牌
}

// TokenResponse token响应结构
type TokenResponse struct {
	AccessToken  string `json:"access_token" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."`  // 访问令牌
	RefreshToken string `json:"refresh_token" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."` // 刷新令牌
	TokenType    string `json:"token_type" example:"Bearer"`                                     // 令牌类型
	ExpiresIn    int64  `json:"expires_in" example:"900"`                                        // 访问令牌过期时间(秒)
}

// AuthUserInfoResponse 认证用户信息响应结构
type AuthUserInfoResponse struct {
	ID          uint64        `json:"id" example:"1"`                    // 用户ID
	Username    string        `json:"username" example:"admin"`          // 用户名
	Email       string        `json:"email" example:"admin@example.com"` // 邮箱
	Nickname    string        `json:"nickname" example:"管理员"`            // 昵称
	Phone       string        `json:"phone" example:"13800138000"`       // 电话
	IsSuperuser bool          `json:"is_superuser" example:"true"`       // 是否超级管理员
	RoleID      uint          `json:"role_id" example:"1"`               // 角色ID
	Role        *RoleResponse `json:"role,omitempty"`                    // 角色信息(使用已有的RoleResponse)
	Status      int           `json:"status" example:"1"`                // 状态
}

// ConvertUserToAuthUserInfoResponse 将用户模型转换为认证用户信息响应
func ConvertUserToAuthUserInfoResponse(user *models.User) *AuthUserInfoResponse {
	response := &AuthUserInfoResponse{
		ID:          user.ID,
		Username:    user.Username,
		Email:       user.Email,
		Nickname:    user.Nickname,
		Phone:       user.Phone,
		IsSuperuser: user.IsSuperuser,
		RoleID:      user.RoleID,
		Status:      user.Status,
	}

	// 如果有角色信息，则转换角色数据
	if user.Role != nil {
		response.Role = &RoleResponse{
			ID:          uint(user.Role.ID),
			Name:        user.Role.Name,
			Description: user.Role.Description,
		}
	}

	return response
}
